O objetivo do checkpoint 3 do Lab 3 é realizar novamente a clusterização de algum conjunto de dados, porém desta vez o foco é a visualização dos dados através de técnicas de redução de dimensionalidade.

Para esse checkpoint, foram utilizados dados quantitativos que a CAPES utiliza na avaliação dos programas de pós-graduação em Ciência da Computação segundo o Comitê de Avaliação. Os dados foram coletados da Plataforma Sucupira, e incluem quantificações da produção de artigos, dissertações e teses nos últimos 4 anos para os diferentes PPGs.

Escolha bem as suas variáveis, transformações, normalização, etc., e faça um descritivo das variáveis antes de começar. Também lembre de comentar os grupos encontrados e, principalmente para essa parte do problema, as relações entre as dimensões que você encontrou via PCA e as variáveis originais. Sempre comente também os padrões interessantes que você encontrar.

0. Imports and Settings

library(broom)
library(cluster)
library(dplyr, warn.conflicts = FALSE)
library(GGally, warn.conflicts = FALSE)
library(ggdendro)
library(ggplot2)
library(ggfortify)
library(highcharter, quietly = TRUE)
library(knitr)
library(readr)
library(tibble)
library(tidyr)
require(Rtsne, quietly = TRUE)
source('multiplot.R')

1. Análise Descritiva

Primeiramente, vou carregar os dados e ter uma noção do seus valores:

dados_all <- read_csv("data/capes-cacc.csv")
glimpse(dados_all)
## Observations: 75
## Variables: 31
## $ Instituição                <chr> "UNIVERSIDADE FEDERAL DO AMAZONAS",...
## $ Programa                   <chr> "INFORMÁTICA (12001015012P2)", "CIÊ...
## $ Nível                      <int> 5, 4, 3, 3, 3, 5, 4, 3, 3, 3, 5, 3,...
## $ Sigla                      <chr> "UFAM", "UFPA", "UFMA", "UEMA", "FU...
## $ Tem doutorado              <chr> "Sim", "Sim", "Não", "Não", "Não", ...
## $ Docentes colaboradores     <dbl> 0.25, 5.50, 3.00, 6.25, 1.75, 2.00,...
## $ Docentes permanentes       <dbl> 24.75, 14.00, 10.00, 14.00, 9.50, 2...
## $ Docentes visitantes        <dbl> 0.00, 0.00, 0.00, 0.00, 0.00, 0.75,...
## $ Resumos em conf            <int> 20, 23, 15, 5, 4, 10, 6, 136, 0, 24...
## $ Resumos expandidos em conf <int> 25, 24, 7, 10, 1, 68, 9, 13, 4, 6, ...
## $ Artigos em conf            <int> 390, 284, 115, 73, 150, 269, 179, 0...
## $ Dissertacoes               <int> 108, 77, 50, 25, 31, 75, 60, 129, 4...
## $ Teses                      <int> 14, NA, NA, NA, NA, 24, 5, NA, NA, ...
## $ periodicos_A1              <int> 15, 19, 5, 1, 7, 21, 21, 0, 3, 8, 4...
## $ periodicos_A2              <int> 19, 21, 11, 1, 4, 32, 13, 0, 9, 2, ...
## $ periodicos_B1              <int> 19, 38, 7, 3, 6, 26, 16, 2, 6, 4, 3...
## $ periodicos_B2              <int> 1, 12, 2, 6, 0, 0, 11, 0, 0, 2, 1, ...
## $ periodicos_B3              <int> 3, 16, 2, 2, 3, 16, 15, 0, 4, 6, 9,...
## $ periodicos_B4              <int> 0, 4, 0, 3, 3, 0, 1, 3, 1, 6, 0, 0,...
## $ periodicos_B5              <int> 10, 16, 8, 4, 12, 4, 16, 2, 6, 2, 1...
## $ periodicos_C               <int> 9, 34, 12, 5, 2, 3, 11, 9, 5, 10, 1...
## $ periodicos_NA              <int> 7, 15, 8, 11, 12, 6, 19, 31, 7, 14,...
## $ per_comaluno_A1            <int> 4, 1, 0, 0, 1, 7, 5, 0, 1, 0, 10, N...
## $ per_comaluno_A2            <int> 5, 5, 5, 0, 2, 15, 3, 0, 3, 0, 3, N...
## $ per_comaluno_B1            <int> 4, 2, 5, 2, 2, 14, 6, 0, 2, 0, 17, ...
## $ per_comaluno_B2            <int> 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, NA...
## $ per_comaluno_B3            <int> 2, 2, 0, 1, 0, 7, 9, 0, 2, 0, 4, NA...
## $ per_comaluno_B4            <int> 0, 0, 0, 0, 2, 0, 1, 0, 1, 3, 0, NA...
## $ per_comaluno_B5            <int> 5, 0, 4, 0, 8, 3, 6, 0, 4, 0, 4, NA...
## $ per_comaluno_C             <int> 6, 5, 3, 1, 2, 3, 7, 1, 2, 4, 8, NA...
## $ per_comaluno_NA            <int> 6, 14, 2, 2, 9, 3, 6, 4, 5, 1, 10, ...

A primeira modificação que vou efetuar nos dados é setar os valores nulos para 0. Além disso, vou criar duas novas colunas:

Logo, além dessas duas variáveis, para essa análise, também considerarei outras seis variáveis:

Para fins de visualização, também vou armazenar o nome da instituição.

dados <- dados_all %>%
  replace(is.na(.), 0) %>%
  mutate(instituicao = sprintf("%s (%s)", Instituição, Sigla)) %>%
  mutate(periodicos_restrito = periodicos_A1 + periodicos_A2 + periodicos_B1) %>%
  mutate(periodicos_qualis = periodicos_B1 + periodicos_B2 + periodicos_B3 + periodicos_B4 + periodicos_B5) %>%
  select(instituicao,
         nivel = Nível,
         colaboradores = `Docentes colaboradores`,
         permanentes = `Docentes permanentes`,
         artigos_conf = `Artigos em conf`,
         dissertacoes = Dissertacoes,
         teses = Teses,
         periodicos_restrito,
         periodicos_qualis)

dados %>% head()
## # A tibble: 6 × 9
##                                      instituicao nivel colaboradores
##                                            <chr> <int>         <dbl>
## 1        UNIVERSIDADE FEDERAL DO AMAZONAS (UFAM)     5          0.25
## 2            UNIVERSIDADE FEDERAL DO PARÁ (UFPA)     4          5.50
## 3        UNIVERSIDADE FEDERAL DO MARANHÃO (UFMA)     3          3.00
## 4       UNIVERSIDADE ESTADUAL DO MARANHÃO (UEMA)     3          6.25
## 5 FUNDAÇÃO UNIVERSIDADE FEDERAL DO PIAUÍ (FUFPI)     3          1.75
## 6            UNIVERSIDADE FEDERAL DO CEARÁ (UFC)     5          2.00
## # ... with 6 more variables: permanentes <dbl>, artigos_conf <int>,
## #   dissertacoes <dbl>, teses <dbl>, periodicos_restrito <int>,
## #   periodicos_qualis <int>

Vamos começar analisando o sumário dos dados:

dados %>%
  select(-instituicao) %>%
  summary()
##      nivel       colaboradores     permanentes     artigos_conf  
##  Min.   :3.000   Min.   : 0.000   Min.   : 3.00   Min.   :  0.0  
##  1st Qu.:3.000   1st Qu.: 1.125   1st Qu.:11.00   1st Qu.:121.5  
##  Median :3.000   Median : 3.000   Median :16.00   Median :187.0  
##  Mean   :3.813   Mean   : 3.990   Mean   :20.22   Mean   :239.6  
##  3rd Qu.:4.000   3rd Qu.: 5.625   3rd Qu.:25.50   3rd Qu.:293.5  
##  Max.   :7.000   Max.   :22.250   Max.   :67.25   Max.   :959.0  
##   dissertacoes        teses        periodicos_restrito periodicos_qualis
##  Min.   :  0.00   Min.   :  0.00   Min.   :  0.00      Min.   :  1.00   
##  1st Qu.: 35.50   1st Qu.:  0.00   1st Qu.: 17.50      1st Qu.: 18.50   
##  Median : 56.00   Median :  0.00   Median : 40.00      Median : 32.00   
##  Mean   : 73.77   Mean   : 14.56   Mean   : 56.87      Mean   : 42.39   
##  3rd Qu.:102.50   3rd Qu.: 14.00   3rd Qu.: 66.00      3rd Qu.: 53.00   
##  Max.   :433.00   Max.   :152.00   Max.   :355.00      Max.   :274.00

O sumário dos dados apresentam informações interessantes:

Também é importante saber o desvio-padrão dessas variáveis:

dados %>%
  summarise(sd(colaboradores), sd(permanentes), sd(artigos_conf), sd(dissertacoes), sd(teses), sd(periodicos_qualis), sd(periodicos_restrito))
## # A tibble: 1 × 7
##   `sd(colaboradores)` `sd(permanentes)` `sd(artigos_conf)`
##                 <dbl>             <dbl>              <dbl>
## 1            3.967444          12.35931             183.73
## # ... with 4 more variables: `sd(dissertacoes)` <dbl>, `sd(teses)` <dbl>,
## #   `sd(periodicos_qualis)` <dbl>, `sd(periodicos_restrito)` <dbl>

Podemos ver que artigos em conferência apresentam o maior desvio-padrão, seguido por periódicos no Qualis restrito e dissertações, respectivamente.

Vamos agora analisar a distribuição das variáveis individualmente e aos pares:

dados %>%
  select(-instituicao) %>%
  ggpairs()

Ao analisar as variáveis de forma individual (diagonal principal), podemos ver que praticamente todas as variáveis apresentam uma distribuição à esquerda com cauda longa à direita. É importante destacar que a variável nível apresenta uma distribuição bimodal, devido ao fato de existirem mais programas de pós-graduação com níveis mais baixos (3 e 4).

Por outro lado, quando analisamos as variáveis aos pares, podemos ver que existem bastante correlações fortes (> 0.7) entre as variáveis. A maior correlação é observada entre a quantidade de periódicos publicados no Qualis restrito e nos demais Qualis (0.925), ou seja, quanto mais se publica periódicos em eventos com Qualis restrito, mais se publica nos demais Qualis. Obviamente, isso não representa uma causalidade, mas, de certa forma, é um comportamento esperado. Também pode-se observar forte correlação entre a quantidade artigos publicados em periódicos com Qualis restrito e a docentes permanentes (0.901) e artigos publicados em conferências (0.904).

Agora, quero fazer algumas visualizações. Primeiramente, quero analisar a distribuição dos níveis dos programas de pós-graduação do país:

dados %>%
  ggplot(aes(x = nivel)) +
  geom_bar()

Como visto anteriormente, a maior parte dos programas de pós-graduação apresentam os níveis 3 e 4. Há apenas 5 programas com nível 5. É interessante observar que há mais programas de nível 7 do que 6 (5 contra 3, respectivamente).

Vamos analisar quais são as instituições que mais produzem dissertações de Mestrado:

dados %>%
  top_n(10, dissertacoes) %>%
  ggplot(aes(x = reorder(instituicao, dissertacoes), y = dissertacoes)) +
  geom_bar(stat = "identity") +
  coord_flip()

A UFPE é a universidade brasileira que mais produz dissertações de Mestrado no país (+400), produzindo mais que o dobro da segunda colocada, a USP (São Carlos).

E qual será a universidade que mais produz teses de Doutorado?

dados %>%
  top_n(10, teses) %>%
  ggplot(aes(x = reorder(instituicao, teses), y = teses)) +
  geom_bar(stat = "identity") +
  coord_flip()

Nesse caso, ocorre o inverso, com a USP (São Carlos) à frente da UFPE. Porém, a quantidade de teses produzidas é bem mais parecida entre as duas universidades.

Qual a universidade que mais publica artigos em conferência?

dados %>%
  top_n(10, artigos_conf) %>%
  ggplot(aes(x = reorder(instituicao, artigos_conf), y = artigos_conf)) +
  geom_bar(stat = "identity") +
  coord_flip()

De forma individual, a USP de São Carlos é a universidade responsável pelo maior número de publicações em conferências. Porém, a UFPE aparece com um número maior devido quando somados os dois programas de pós-graduação (stricto sensu e profisional).

Quero agora saber a respeito das publicações em periódicos. Primeiramente, quero analisar as publicações dos periódicos fora do Qualis restrito (B2 a B5):

dados %>%
  top_n(10, periodicos_qualis) %>%
  ggplot(aes(x = reorder(instituicao, periodicos_qualis), y = periodicos_qualis)) +
  geom_bar(stat = "identity") +
  coord_flip()

Novamente, a USP (São Carlos) lidera o ranking, com aproximadamente o dobro da segunda colocada, a UniCamp. A UFRJ publica aproximadamente 200 artigos quando considerados os dois programas da pós-graduação (Informática e Engenharia de Sistemas e Computação).

Por fim, quero fazer a mesma análise, porém para os artigos publicados em periódicos no Qualis restrito:

dados %>%
  top_n(10, periodicos_restrito) %>%
  ggplot(aes(x = reorder(instituicao, periodicos_restrito), y = periodicos_restrito)) +
  geom_bar(stat = "identity") +
  coord_flip()

Mais uma vez, a USP de São Carlos encabeça o ranking, seguido pela UFPE se considerarmos os dois programas de pós-graduação descritos anteriormente.

É válido destacar que, de maneira geral, algumas das universidades mostradas nos gráficos acima aparecem em praticamente todos os gráficos. Talvez isso indique algum grupo que vamos encontrar no agrupamento que iremos realizar.

Para finalizar a análise descritiva, quero analisar a disposição das variáveis de forma individual:

plot_nivel <- dados %>%
  ggplot(aes(x = 0, y = nivel)) +
  geom_point(alpha = 0.3) 

plot_colaboradores <- dados %>%
  ggplot(aes(x = 0, y = colaboradores)) +
  geom_boxplot() +
  geom_point(alpha = 0.5, position = position_jitter(width = 0.01)) 

plot_permanentes <- dados %>%
  ggplot(aes(x = 0, y = permanentes)) +
  geom_boxplot() +
  geom_point(alpha = 0.5, position = position_jitter(width = 0.01)) 

plot_artigos_conf <- dados %>%
  ggplot(aes(x = 0, y = artigos_conf)) +
  geom_boxplot() +
  geom_point(alpha = 0.5, position = position_jitter(width = 0.01)) 

plot_dissertacoes <- dados %>%
  ggplot(aes(x = 0, y = dissertacoes)) +
  geom_boxplot() +
  geom_point(alpha = 0.5, position = position_jitter(width = 0.01)) 

plot_teses <- dados %>%
  ggplot(aes(x = 0, y = teses)) +
  geom_boxplot() +
  geom_point(alpha = 0.5, position = position_jitter(width = 0.01)) 

plot_per_qualis <- dados %>%
  ggplot(aes(x = 0, y = periodicos_qualis)) +
  geom_boxplot() +
  geom_point(alpha = 0.5, position = position_jitter(width = 0.01)) 

plot_per_restrito <- dados %>%
  ggplot(aes(x = 0, y = periodicos_restrito)) +
  geom_boxplot() +
  geom_point(alpha = 0.5, position = position_jitter(width = 0.01)) 

multiplot(plot_nivel, plot_colaboradores, plot_permanentes, plot_artigos_conf, plot_dissertacoes, plot_teses, plot_per_qualis, plot_per_restrito, cols = 4)

Pelo gráfico acima, conseguimos confirmar que as variáveis se concentram na parte inferior do gráfico, como visto no gráfico de pares. Eu também arriscaria dizer que existem de 3 a 5 grupos de universidades. Vamos verificar isso na próxima seção.

2. Clusterização

Antes de efetuarmos a clusterização, vou efetuar a padronização dos dados. Como visto no checkpoint anterior, isso é de extrema imoportância para evitar que variáveis com range grande se sobreponham sobre as variáveis de baixo range de valores.

dados_pro <- dados %>%
  mutate(colaboradores = as.vector(scale(colaboradores)),
         permanentes = as.vector(scale(permanentes)),
         artigos_conf = as.vector(scale(artigos_conf+1)),
         dissertacoes = as.vector(scale(dissertacoes+1)),
         teses = as.vector(scale(teses+1)),
         periodicos_qualis = as.vector(scale(periodicos_qualis+1)),
         periodicos_restrito = as.vector(scale(periodicos_restrito+1)))

dados_pro %>% head()
## # A tibble: 6 × 9
##                                      instituicao nivel colaboradores
##                                            <chr> <int>         <dbl>
## 1        UNIVERSIDADE FEDERAL DO AMAZONAS (UFAM)     5    -0.9426725
## 2            UNIVERSIDADE FEDERAL DO PARÁ (UFPA)     4     0.3805977
## 3        UNIVERSIDADE FEDERAL DO MARANHÃO (UFMA)     3    -0.2495310
## 4       UNIVERSIDADE ESTADUAL DO MARANHÃO (UEMA)     3     0.5696363
## 5 FUNDAÇÃO UNIVERSIDADE FEDERAL DO PIAUÍ (FUFPI)     3    -0.5645953
## 6            UNIVERSIDADE FEDERAL DO CEARÁ (UFC)     5    -0.5015824
## # ... with 6 more variables: permanentes <dbl>, artigos_conf <dbl>,
## #   dissertacoes <dbl>, teses <dbl>, periodicos_restrito <dbl>,
## #   periodicos_qualis <dbl>

2.1 Clusterização Hierárquica

O primeiro agrupamento que vou efetuar é a clusterização hierárquica. Previamente, eu realizei alguns testes empíricos com combinações diferentes de métodos de distância e agrupamento. Os melhores parâmetros que eu encontrei são mostrados no código a seguir:

distancias <- dados_pro %>%
  column_to_rownames("instituicao") %>%
  dist(method = "maximum")
## Warning: Setting row names on a tibble is deprecated.
clust_hier <- distancias %>%
  hclust(method = "ward.D")

ggdendrogram(clust_hier, rotate = TRUE)

O dendograma acima mostra a árvore de agrupamento realizada pelo algoritmo de clusterização hierárquica. Visualmente, eu acredito que 3 ou 4 grupos formariam uma boa clusterização. Além disso, também quero destacar alguns pontos interessantes:

  • As melhores universidades brasileiras se encontram na parte de baixo do dendograma;
  • A UFPB foi agrupada com a USP/EACH e FESP/UPE;
  • A UFCG foi agrupada com a UFPR;

Vamos agora plotar o gráfico de silhueta. Eu testei o gráfico para 3 e 4 grupos. Acabei escolhendo 4 grupos, pois achei a quantidade de pontos em cada grupo mais homogênea em relação a somente 3 grupos.

plot(silhouette(cutree(clust_hier, k = 4), distancias))

Pode-se perceber pelo gráfico acima que os 4 grupos possuem entre 8 e 28 universidades. Ademais, a maior parte dos pontos estão bem alocados em seus grupos. O grupo 3 é o grupo com o melhor alocamento de pontos, enquanto o grupo 2 apresenta a maior dúvida sobre a alocação de alguns de seus pontos.

Tendo em vista que clusterizamos as universidades em 4 grupos pelo algoritmo de clusterização hierárquica, vamos agora analisar as características de cada um dos grupos e distingui-los:

atribuicoes <- cbind(dados_pro, grupo = cutree(clust_hier, k = 4))

atribuicoes %>%
  select(-instituicao) %>%
  ggparcoord(columns = c(1:8), groupColumn="grupo", scale = "globalminmax") +
  facet_grid(paste("Grupo ", grupo) ~ .) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks=c(0, 2, 4, 6))

De acordo com o gráfico acima, eu nomearia os grupos da seguinte maneira (fazendo analogia ao campeonato brasileiro):

Grupo 1: Série B (Universidades que brigam para subir) Universidades de nível 3-5, poucos colaboradores e o restante das variáveis na média geral;

Grupo 2: Série C (Universidades que querem se tornar "profissionais") Universidades de nível 3-4, com mais colaboradores que as do Grupo 1, porém almejam o Doutorado (Série B) em sua maioria.

Grupo 3: Série D (Várzea) Universidades de nível 3, sem Doutorado, e com a maioria das variáveis abaixo da média.

Grupo 4: Série A (Universidades supra-sumo) Universidades de nível 6-7, com alto nível de produção científica em geral.

Vamos agora visualizar alguns integrantes desses grupos:

dados_hclust <- atribuicoes %>%
  left_join(dados, by = c("instituicao")) %>%
  select(instituicao, nivel.y, colaboradores.y, permanentes.y, artigos_conf.y, dissertacoes.y, teses.y, periodicos_qualis.y, periodicos_restrito.y,  grupo)

dados_hclust %>%
  filter(grupo == 1) %>%
  head(10)
##                                                  instituicao nivel.y
## 1                    UNIVERSIDADE FEDERAL DO AMAZONAS (UFAM)       5
## 2                        UNIVERSIDADE FEDERAL DO CEARÁ (UFC)       5
## 3                         UNIVERSIDADE DE FORTALEZA (UNIFOR)       4
## 4         UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE (UFRN)       5
## 5          UNIVERSIDADE FEDERAL DA BAHIA (UFBA/UNIFACS/UEFS)       4
## 6                  UNIVERSIDADE FEDERAL DA BAHIA (UFBA/UEFS)       3
## 7                       UNIVERSIDADE FEDERAL DA BAHIA (UFBA)       4
## 8          UNIVERSIDADE FEDERAL DO RIO DE JANEIRO (UFRJ/INF)       4
## 9                      UNIVERSIDADE FEDERAL FLUMINENSE (UFF)       5
## 10 UNIVERSIDADE FEDERAL DO ESTADO DO RIO DE JANEIRO (UNIRIO)       4
##    colaboradores.y permanentes.y artigos_conf.y dissertacoes.y teses.y
## 1             0.25         24.75            390            108      14
## 2             2.00         20.75            269             75      24
## 3             1.00         16.00            179             60       5
## 4             2.25         26.25            389            108      29
## 5             3.00         19.00            277              0      20
## 6             0.50         23.25            255             41       0
## 7             3.75         22.00            230              8       0
## 8             2.75         28.25            288            101      16
## 9             0.00         40.00            504            110      56
## 10            0.50         17.50            268             89       0
##    periodicos_qualis.y periodicos_restrito.y grupo
## 1                   33                    53     1
## 2                   46                    79     1
## 3                   59                    50     1
## 4                   53                    99     1
## 5                   34                    50     1
## 6                   30                    45     1
## 7                   30                    51     1
## 8                   75                   101     1
## 9                   79                   138     1
## 10                  32                    27     1
dados_hclust %>%
  filter(grupo == 2) %>%
  head(10)
##                                                      instituicao nivel.y
## 1                            UNIVERSIDADE FEDERAL DO PARÁ (UFPA)       4
## 2         UNIVERSIDADE FEDERAL DA PARAÍBA/JOÃO PESSOA (UFPB/J.P)       3
## 3                  UNIVERSIDADE FEDERAL DE CAMPINA GRANDE (UFCG)       4
## 4                 UNIVERSIDADE FEDERAL DE PERNAMBUCO (UFPE/Prof)       3
## 5                 FUNDAÇÃO UNIVERSIDADE DE PERNAMBUCO (FESP/UPE)       3
## 6  CENTRO DE ESTUDOS E SISTEMAS AVANÇADOS DO RECIFE (CESAR/Prof)       3
## 7                  UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO (UFES)       4
## 8                           UNIVERSIDADE DE SÃO PAULO (USP/EACH)       3
## 9                    UNIVERSIDADE FEDERAL DE SÃO PAULO (UNIFESP)       3
## 10                           UNIVERSIDADE FEDERAL DO ABC (UFABC)       3
##    colaboradores.y permanentes.y artigos_conf.y dissertacoes.y teses.y
## 1             5.50         14.00            284             77       0
## 2             5.00         20.00            322            108       0
## 3             9.25         31.00            338            104      40
## 4             8.50         32.00            585             92       0
## 5             6.50         10.75            255             71       0
## 6            13.75         12.50             79             93       0
## 7             6.00         22.25            336            110       5
## 8             6.25         14.25            227             56       0
## 9             3.00         21.00            167             24       0
## 10            7.25         29.75            156             60       0
##    periodicos_qualis.y periodicos_restrito.y grupo
## 1                   86                    78     2
## 2                   42                    52     2
## 3                   56                    64     2
## 4                   69                   122     2
## 5                   33                    29     2
## 6                    1                     2     2
## 7                   11                    43     2
## 8                   59                    36     2
## 9                   67                    75     2
## 10                  37                    49     2
dados_hclust %>%
  filter(grupo == 3) %>%
  head(10)
##                                                            instituicao
## 1                              UNIVERSIDADE FEDERAL DO MARANHÃO (UFMA)
## 2                             UNIVERSIDADE ESTADUAL DO MARANHÃO (UEMA)
## 3                       FUNDAÇÃO UNIVERSIDADE FEDERAL DO PIAUÍ (FUFPI)
## 4                           UNIVERSIDADE ESTADUAL DO CEARÁ (UECE/Prof)
## 5                                UNIVERSIDADE ESTADUAL DO CEARÁ (UECE)
## 6  INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO CEARÁ (IFCE)
## 7              UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE (UFRN/Prof)
## 8          UNIVERSIDADE DO ESTADO DO RIO GRANDE DO NORTE (UERN/UFERSA)
## 9                     UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO (UFRPE)
## 10                              UNIVERSIDADE FEDERAL DE ALAGOAS (UFAL)
##    nivel.y colaboradores.y permanentes.y artigos_conf.y dissertacoes.y
## 1        3            3.00         10.00            115             50
## 2        3            6.25         14.00             73             25
## 3        3            1.75          9.50            150             31
## 4        3            6.25         15.75              0            129
## 5        3            2.75          8.50            120             45
## 6        3            0.75          9.00             92              3
## 7        3            2.00          8.50             60             12
## 8        3            4.25         13.50            127             94
## 9        3            3.50         14.00            132             26
## 10       3            5.75         14.00            185             23
##    teses.y periodicos_qualis.y periodicos_restrito.y grupo
## 1        0                  19                    23     3
## 2        0                  18                     5     3
## 3        0                  24                    17     3
## 4        0                   7                     2     3
## 5        0                  17                    18     3
## 6        0                  20                    14     3
## 7        0                   4                     6     3
## 8        0                  12                    14     3
## 9        0                  42                    32     3
## 10       0                  34                    48     3
dados_hclust %>%
  filter(grupo == 4) %>%
  head(10)
##                                                    instituicao nivel.y
## 1                    UNIVERSIDADE FEDERAL DE PERNAMBUCO (UFPE)       6
## 2                UNIVERSIDADE FEDERAL DO RIO DE JANEIRO (UFRJ)       7
## 3 PONTIFÍCIA UNIVERSIDADE CATÓLICA DO RIO DE JANEIRO (PUC/RIO)       7
## 4                  UNIVERSIDADE FEDERAL DE MINAS GERAIS (UFMG)       7
## 5                          UNIVERSIDADE DE SÃO PAULO (USP/IME)       6
## 6              UNIVERSIDADE DE SÃO PAULO/SÃO CARLOS (★USP/SC★)       6
## 7                  UNIVERSIDADE ESTADUAL DE CAMPINAS (UNICAMP)       7
## 8            UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL (UFRGS)       7
##   colaboradores.y permanentes.y artigos_conf.y dissertacoes.y teses.y
## 1           22.25         58.50            763            433     144
## 2            2.00         38.75            359            154      87
## 3            0.00         25.25            367            146      68
## 4            4.25         47.50            809            213      49
## 5            9.75         32.75            296            120      57
## 6           13.25         67.25            959            220     152
## 7            5.50         41.50            546            151      73
## 8            3.00         54.25            680            177      73
##   periodicos_qualis.y periodicos_restrito.y grupo
## 1                 113                   187     4
## 2                 122                   194     4
## 3                  50                   106     4
## 4                 105                   231     4
## 5                 116                   144     4
## 6                 274                   355     4
## 7                 131                   235     4
## 8                  86                   238     4

É interessante notar que a UFPB e UFCG estão situadas no Grupo 2.

2.2 K-Means

Agora vou utilizar o K-means para clusterização. Vou começar analisando o valor de tot.withinss para o K-means aplicado de 2 a 12 grupos. O valor de tot.withinss representa o somatório dos quadrados das distâncias de cada ponto em cluster \(c_i\) para o centro do cluster. Esse valor tende a zero quando o número de clusters é igual ao número de pontos.

set.seed(1234)
explorando_k <- tibble(k = 2:12) %>%
  group_by(k) %>%
  do(
    kmeans(select(dados_pro, -instituicao), centers = .$k, nstart = 20) %>% glance()
  )

explorando_k %>%
  ggplot(aes(x = k, y = tot.withinss)) +
  geom_line() +
  geom_point() +
  scale_x_continuous(breaks=c(2:12))

Pelo gráfico, podemos ver que o valor de tot.withinss descresce bastante de 2 para 3 clusters e de 3 para 4 clusters. De 4 clusters em diante, esse valor descrece pouco. Logo, por esse grafico, podemos definir 4 clusters como a quantidade de clusters "ideal".

Podemos também analisar também a proporção entre as distâncias dos centróides dos clusters em relação ao centróide dos pontos, e a distância de todos os pontos para o centróide dos pontos:

explorando_k %>%
  ggplot(aes(x = k, y = betweenss/totss)) +
  geom_line() +
  geom_point() +
  scale_x_continuous(breaks = c(2:12))

Esse gráfico apresenta um comportamente parecido com o anterior. Novamente, a escolha de 4 clusters é a mais sensata.

Visto que 4 clusters representam a melhor escolha para o número de clusters de acordo com os gráficos, vamos analisar a representação desses grupos:

set.seed(1234)
km <- dados_pro %>%
  select(-instituicao) %>%
  kmeans(centers = 4, nstart = 20)

km %>%
  augment(dados_pro) %>%
  select(-instituicao) %>%
  ggparcoord(columns = c(1:8), groupColumn = ".cluster", scale = "globalminmax") +
  facet_grid(paste("Grupo ", .cluster) ~ .) +
  ylab("Z-score") +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = c(0, 2, 4, 6))

Seguindo a mesma ideia dos grupos da clusterização hierárquica, eu nomearia os grupos da seguinte forma:

Grupo 1: Série D (Várzea) Universidades de nível 3 e 4, sem Doutorado ou pouco produtivo, e com a maioria das variáveis abaixo da média de maneira geral.

Grupo 1: Fora do padrão (Universidades modelo) Universidades de nível 6, com todas as variáveis bem acima da média. Altíssimoo nível de produção científica.

Grupo 3: Série B Universidades de nível 3-5, e acima da média de maneira geral.

Grupo 4: Série A Universidades de nível 5-7, poucos colabores em sua maioria, mas com nível de produção científica acima da média

Ao meu ver, os grupos 1, 3 e 4 são bastante parecidos com os grupos equivalentes da clusterização hierárquica.

Assim como na seção anterior, vamos analisar as universidades participantes de cada grupo:

dados_km <- km %>%
  augment(dados) 

dados_km %>% 
  filter(.cluster == 1) %>%
  head(10)
##                                                            instituicao
## 1                              UNIVERSIDADE FEDERAL DO MARANHÃO (UFMA)
## 2                             UNIVERSIDADE ESTADUAL DO MARANHÃO (UEMA)
## 3                       FUNDAÇÃO UNIVERSIDADE FEDERAL DO PIAUÍ (FUFPI)
## 4                           UNIVERSIDADE ESTADUAL DO CEARÁ (UECE/Prof)
## 5                                UNIVERSIDADE ESTADUAL DO CEARÁ (UECE)
## 6  INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO CEARÁ (IFCE)
## 7              UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE (UFRN/Prof)
## 8          UNIVERSIDADE DO ESTADO DO RIO GRANDE DO NORTE (UERN/UFERSA)
## 9                     UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO (UFRPE)
## 10                      FUNDAÇÃO UNIVERSIDADE DE PERNAMBUCO (FESP/UPE)
##    nivel colaboradores permanentes artigos_conf dissertacoes teses
## 1      3          3.00       10.00          115           50     0
## 2      3          6.25       14.00           73           25     0
## 3      3          1.75        9.50          150           31     0
## 4      3          6.25       15.75            0          129     0
## 5      3          2.75        8.50          120           45     0
## 6      3          0.75        9.00           92            3     0
## 7      3          2.00        8.50           60           12     0
## 8      3          4.25       13.50          127           94     0
## 9      3          3.50       14.00          132           26     0
## 10     3          6.50       10.75          255           71     0
##    periodicos_restrito periodicos_qualis .cluster
## 1                   23                19        1
## 2                    5                18        1
## 3                   17                24        1
## 4                    2                 7        1
## 5                   18                17        1
## 6                   14                20        1
## 7                    6                 4        1
## 8                   14                12        1
## 9                   32                42        1
## 10                  29                33        1
dados_km %>%
  filter(.cluster == 2) %>%
  head()
##                                       instituicao nivel colaboradores
## 1       UNIVERSIDADE FEDERAL DE PERNAMBUCO (UFPE)     6         22.25
## 2 UNIVERSIDADE DE SÃO PAULO/SÃO CARLOS (★USP/SC★)     6         13.25
##   permanentes artigos_conf dissertacoes teses periodicos_restrito
## 1       58.50          763          433   144                 187
## 2       67.25          959          220   152                 355
##   periodicos_qualis .cluster
## 1               113        2
## 2               274        2
dados_km %>%
  filter(.cluster == 3) %>%
  head(10)
##                                               instituicao nivel
## 1                 UNIVERSIDADE FEDERAL DO AMAZONAS (UFAM)     5
## 2                     UNIVERSIDADE FEDERAL DO PARÁ (UFPA)     4
## 3                     UNIVERSIDADE FEDERAL DO CEARÁ (UFC)     5
## 4                      UNIVERSIDADE DE FORTALEZA (UNIFOR)     4
## 5      UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE (UFRN)     5
## 6  UNIVERSIDADE FEDERAL DA PARAÍBA/JOÃO PESSOA (UFPB/J.P)     3
## 7           UNIVERSIDADE FEDERAL DE CAMPINA GRANDE (UFCG)     4
## 8          UNIVERSIDADE FEDERAL DE PERNAMBUCO (UFPE/Prof)     3
## 9       UNIVERSIDADE FEDERAL DA BAHIA (UFBA/UNIFACS/UEFS)     4
## 10          UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO (UFES)     4
##    colaboradores permanentes artigos_conf dissertacoes teses
## 1           0.25       24.75          390          108    14
## 2           5.50       14.00          284           77     0
## 3           2.00       20.75          269           75    24
## 4           1.00       16.00          179           60     5
## 5           2.25       26.25          389          108    29
## 6           5.00       20.00          322          108     0
## 7           9.25       31.00          338          104    40
## 8           8.50       32.00          585           92     0
## 9           3.00       19.00          277            0    20
## 10          6.00       22.25          336          110     5
##    periodicos_restrito periodicos_qualis .cluster
## 1                   53                33        3
## 2                   78                86        3
## 3                   79                46        3
## 4                   50                59        3
## 5                   99                53        3
## 6                   52                42        3
## 7                   64                56        3
## 8                  122                69        3
## 9                   50                34        3
## 10                  43                11        3
dados_km %>%
  filter(.cluster == 4) %>%
  head(7)
##                                                    instituicao nivel
## 1                UNIVERSIDADE FEDERAL DO RIO DE JANEIRO (UFRJ)     7
## 2                        UNIVERSIDADE FEDERAL FLUMINENSE (UFF)     5
## 3 PONTIFÍCIA UNIVERSIDADE CATÓLICA DO RIO DE JANEIRO (PUC/RIO)     7
## 4                  UNIVERSIDADE FEDERAL DE MINAS GERAIS (UFMG)     7
## 5                          UNIVERSIDADE DE SÃO PAULO (USP/IME)     6
## 6                  UNIVERSIDADE ESTADUAL DE CAMPINAS (UNICAMP)     7
## 7            UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL (UFRGS)     7
##   colaboradores permanentes artigos_conf dissertacoes teses
## 1          2.00       38.75          359          154    87
## 2          0.00       40.00          504          110    56
## 3          0.00       25.25          367          146    68
## 4          4.25       47.50          809          213    49
## 5          9.75       32.75          296          120    57
## 6          5.50       41.50          546          151    73
## 7          3.00       54.25          680          177    73
##   periodicos_restrito periodicos_qualis .cluster
## 1                 194               122        4
## 2                 138                79        4
## 3                 106                50        4
## 4                 231               105        4
## 5                 144               116        4
## 6                 235               131        4
## 7                 238                86        4

Interessante notar as universidades do Grupo 2. A UFPB e UFCG, agora, aparecem na Série B.

3. Redução da Dimensionalidade

3.1 Principal Component Analysis (PCA)

dados_pca <- dados_pro %>%
  select(-instituicao) %>%
  prcomp(scale = FALSE)

as.data.frame(dados_pca$rotation)
##                            PC1         PC2         PC3        PC4
## nivel               -0.3987424 -0.39555358  0.52035701 -0.3810568
## colaboradores       -0.1695414  0.87508615  0.01662147 -0.2867285
## permanentes         -0.3771071  0.01899928 -0.13278423  0.3423898
## artigos_conf        -0.3700856 -0.05045480 -0.18916490  0.5057392
## dissertacoes        -0.3444813  0.23179410  0.49771651  0.4396016
## teses               -0.3724407  0.02779968  0.13314825 -0.3641500
## periodicos_restrito -0.3847241 -0.13351003 -0.26950427 -0.1122760
## periodicos_qualis   -0.3573444 -0.05028613 -0.58090840 -0.2472224
##                             PC5          PC6         PC7         PC8
## nivel                0.45139603 -0.061567265  0.14935877 -0.19674669
## colaboradores        0.34877604  0.006328333 -0.01758259 -0.03156735
## permanentes          0.05036907  0.752704036  0.37063880 -0.12685934
## artigos_conf         0.32198135 -0.224705020 -0.58701560 -0.26492224
## dissertacoes        -0.37559807 -0.375097007  0.27893822  0.16448305
## teses               -0.59598147  0.281005984 -0.51732230 -0.09165590
## periodicos_restrito  0.14347490 -0.026733780 -0.05119914  0.85147105
## periodicos_qualis   -0.22701321 -0.398417983  0.38389078 -0.33698477
tidy(dados_pca, "pcs") %>%
  ggplot(aes(x = PC, y = cumulative, label = cumulative)) +
  geom_line() +
  geom_point() +
  geom_text(vjust = 1, hjust = -.1)

dados_pro_aug <- km %>% augment(dados)

dados_pca %>%
  augment(dados_pro_aug) %>%
  ggplot(aes(x = .fittedPC1, y = .fittedPC2, color = .cluster)) +
  geom_point(alpha = 0.8) +
  theme(legend.position = "none")

p = dados_pca %>%
  augment(dados_pro_aug) %>%
  hchart("scatter", hcaes(x = .fittedPC1, y = .fittedPC2, color = .cluster)) %>%
  hc_tooltip(pointFormat = "<b>{point.instituicao}</b><br>
                     Nível: {point.nivel}<br>
             Colaboradores: {point.colaboradores}<br>
               Permanentes: {point.permanentes}<br>
             Artigos Conf.: {point.artigos_conf}<br>
              Dissertações: {point.dissertacoes}<br>
                     Teses: {point.teses}<br>
                Per. A1-B1: {point.periodicos_restrito}<br>
                Per. B2-B5: {point.periodicos_qualis}")
p
autoplot(dados_pca, label = F, label.size = 3, shape = T, colour = km$cluster, loadings = TRUE, loadings.color = 'red', loadings.label = TRUE, loadings.label.size = 3, loadings.label.hjust=1.1)
## Warning in if (value %in% columns) {: a condição tem comprimento > 1 e
## somente o primeiro elemento será usado

3.2 t-SNE

set.seed(1234)
tsne.out = dados_pro %>%
  select(-instituicao) %>%
  Rtsne(perplexity = 20)

df <- as.data.frame(tsne.out$Y)
dados_tsne <- cbind(dados_pro_aug, df)

dados_tsne %>%
  ggplot(aes(x = V1, y = V2, color = .cluster)) +
  geom_point(alpha = 0.8) +
  theme(legend.position = "none")

p <- dados_tsne %>%
  hchart("scatter", hcaes(x = V1, y = V2, color = .cluster)) %>%
  hc_tooltip(pointFormat = "<b>{point.instituicao}</b><br>
                     Nível: {point.nivel}<br>
             Colaboradores: {point.colaboradores}<br>
               Permanentes: {point.permanentes}<br>
             Artigos Conf.: {point.artigos_conf}<br>
              Dissertações: {point.dissertacoes}<br>
                     Teses: {point.teses}<br>
                Per. A1-B1: {point.periodicos_restrito}<br>
                Per. B2-B5: {point.periodicos_qualis}")

p